#ifndef AUDIOOUTPUT_H
#define AUDIOOUTPUT_H

#include "../data/AudioFrame.h"
#include <QObject>
#include <QMutex>
#include <QWaitCondition>
#include <SDL.h>
#include <queue>  // 使用标准库的 queue

extern "C" {
    #include <libswresample/swresample.h>
}


class AudioOutput : public QObject
{
    Q_OBJECT

public:
    explicit AudioOutput(QObject* parent = nullptr);
    ~AudioOutput();

    //初始化音频输出
    bool init(int sampleRate, int channels, SwrContext* swrContext);

    //控制播放
    void play();

    //控制暂停
    void pause();

    //控制停止
    void stop();
    
    //音量控制（0-100）
    void setVolume(int volume);
    int getVolume() const;

    //添加音频帧到队列
    void pushFrame(AudioFrame frame);

    //清空缓冲区

    void clearBuffer();

    //获取缓冲区状态
    int getBufferSize() const;
    bool isBufferFull() const;
    
    // 获取当前音频播放时间（毫秒）- 用于音视频同步
    int64_t getCurrentTimeMs() const;
    
    // 设置播放倍速（用于时间计算）
    void setPlaybackSpeed(double speed);
    
    // SDL2 音频回调函数（静态函数，在独立线程中被调用）
    static void audioCallback(void* userdata, Uint8* stream, int len);


signals:
    void bufferLow();
    void playbackPaused();  // 播放暂停
    void playbackResumed(); // 播放恢复

private:
    void fillAudioBuffer(Uint8* stream, int len);
    
    SDL_AudioDeviceID m_deviceId;   // SDL2 音频设备ID
    SDL_AudioSpec m_audioSpec;      // SDL2 音频规格
    SwrContext* m_swrContext;       // 重采样器（从AudioDecoder传入）
    
    std::queue<AudioFrame> m_frameQueue;  // 音频帧队列（使用标准库支持移动语义）
    mutable QMutex m_mutex;           // 保护队列的互斥锁（mutable 允许在 const 函数中使用）
    QWaitCondition m_condition;       // 条件变量
    
    AudioFrame m_currentFrame;        // 当前正在播放的帧
    int m_currentFramePos;           // 当前帧的播放位置
    
    int m_volume;                    // 音量（0-100）
    bool m_isInitialized;            // 是否已初始化
    bool m_isPlaying;                // 是否正在播放
    bool m_shouldStop;               // 是否应该停止接受新帧
    
    // 音视频同步相关
    int64_t m_totalPlayedSamples;    // 已播放的总样本数
    int64_t m_startTimeMs;           // 播放开始时间（用于计算偏移）
    double m_playbackSpeed;          // 播放倍速（用于时间计算）
    
    static const int MAX_BUFFER_SIZE = 10;  // 最大缓冲帧数
};
#endif

